using System;
using System.IO;
using Newtonsoft.Json;
using NLog;

namespace FileSyncApp
{
    /// <summary>
    /// 同步配置数据模型类
    /// 包含文件同步的所有配置信息，如源路径、目标路径、自动启动设置等
    /// </summary>
    public class SyncConfig
    {
        /// <summary>
        /// 源文件夹路径，被监控和同步的文件夹
        /// </summary>
        public string SourcePath { get; set; } = string.Empty;
        
        /// <summary>
        /// 目标文件夹路径，文件同步的目标位置
        /// </summary>
        public string TargetPath { get; set; } = string.Empty;
        
        /// <summary>
        /// 自动启动标志，指示应用程序启动时是否自动开始同步
        /// </summary>
        public bool AutoStart { get; set; } = false;
        
        /// <summary>
        /// 启动时最小化标志，指示应用程序启动时是否最小化到系统托盘
        /// </summary>
        public bool StartMinimized { get; set; } = false;
        
        /// <summary>
        /// 配置最后保存时间，用于跟踪配置的修改历史
        /// </summary>
        public DateTime LastSaved { get; set; } = DateTime.Now;
    }

    /// <summary>
    /// 配置管理器类，负责应用程序配置的加载、保存和管理
    /// 使用JSON格式存储配置文件，支持配置的持久化存储
    /// 配置文件存储在用户的应用程序数据文件夹中
    /// </summary>
    public class ConfigManager
    {
        /// <summary>
        /// NLog日志记录器，用于记录配置操作的详细信息和错误
        /// </summary>
        private static readonly Logger logger = LogManager.GetCurrentClassLogger();
        
        /// <summary>
        /// 配置文件名常量
        /// </summary>
        private const string ConfigFileName = "sync_config.json";
        
        /// <summary>
        /// 配置文件的完整路径
        /// </summary>
        private readonly string _configPath;

        /// <summary>
        /// 初始化配置管理器
        /// 创建应用程序数据文件夹（如果不存在）并设置配置文件路径
        /// </summary>
        public ConfigManager()
        {
            string appDataPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
            string appFolder = Path.Combine(appDataPath, "FileSyncApp");
            
            if (!Directory.Exists(appFolder))
            {
                Directory.CreateDirectory(appFolder);
            }
            
            _configPath = Path.Combine(appFolder, ConfigFileName);
        }

        /// <summary>
        /// 从配置文件加载同步配置
        /// 如果配置文件不存在或加载失败，返回默认配置
        /// </summary>
        /// <returns>同步配置对象，包含所有配置信息</returns>
        public SyncConfig LoadConfig()
        {
            try
            {
                if (File.Exists(_configPath))
                {
                    string json = File.ReadAllText(_configPath);
                    var config = JsonConvert.DeserializeObject<SyncConfig>(json);
                    if (config != null)
                    {
                        logger.Info("配置文件加载成功");
                        return config;
                    }
                }
            }
            catch (Exception ex)
            {
                logger.Error(ex, "加载配置文件失败");
            }

            logger.Info("使用默认配置");
            return new SyncConfig();
        }

        /// <summary>
        /// 保存同步配置到文件
        /// 自动更新保存时间并将配置序列化为JSON格式存储
        /// </summary>
        /// <param name="config">要保存的同步配置对象</param>
        /// <returns>保存成功返回true，失败返回false</returns>
        public bool SaveConfig(SyncConfig config)
        {
            try
            {
                config.LastSaved = DateTime.Now;
                string json = JsonConvert.SerializeObject(config, Formatting.Indented);
                File.WriteAllText(_configPath, json);
                logger.Info("配置文件保存成功");
                return true;
            }
            catch (Exception ex)
            {
                logger.Error(ex, "保存配置文件失败");
                return false;
            }
        }

        /// <summary>
        /// 获取配置文件的完整路径
        /// 用于调试或显示配置文件位置
        /// </summary>
        /// <returns>配置文件的完整路径字符串</returns>
        public string GetConfigPath()
        {
            return _configPath;
        }
    }
}